package br.kanban.view.mb;

import java.io.Serializable;
import java.util.ArrayList;
import java.util.Arrays;
import java.util.List;

import javax.annotation.PostConstruct;
import javax.enterprise.context.ConversationScoped;
import javax.faces.application.FacesMessage;
import javax.inject.Inject;
import javax.inject.Named;

import org.primefaces.context.RequestContext;
import org.primefaces.model.DualListModel;

import br.kanban.core.busines.ProjetoBO;
import br.kanban.core.busines.SprintBO;
import br.kanban.core.busines.UsuarioBO;
import br.kanban.core.persistence.Projeto;
import br.kanban.core.persistence.Sprint;
import br.kanban.core.persistence.Sprint.StatusSprint;
import br.kanban.core.persistence.Usuario;

@ConversationScoped
@Named
public class SprintMB extends GenericMB<Sprint> implements Serializable{

	private static final long serialVersionUID = 1L;
	
	@Inject
	private SprintBO sprintBO;
	
	@Inject
	private UsuarioBO usuarioBO;
	
	@Inject
	private ProjetoBO projetoBO;
	
	private List<Projeto> projetos;

	private List<Usuario> usuariosAval;

	private DualListModel<Usuario> usuarios;
	
	@Inject
	private QuadroService quadroService;

	@Override
	public void pesquisar() {
		lista = sprintBO.pesquisar(filtro);
	}
	
	@PostConstruct
	public void init(){
		if (conversation.isTransient()) conversation.begin();  
		filtro = new Sprint();
		objeto = new Sprint();
		lista = new ArrayList<Sprint>();
		usuariosAval = usuarioBO.pesquisar(new Usuario());
		usuarios = new DualListModel<Usuario>(usuariosAval, new ArrayList<Usuario>());
		projetos = projetoBO.pesquisar(new Projeto());
	}

	@Override
	public void novo() {
		usuariosAval = usuarioBO.pesquisar(new Usuario());
		objeto = new Sprint();
		objeto.setStatus(StatusSprint.ABERTO);
		usuarios = new DualListModel<Usuario>(usuariosAval, new ArrayList<Usuario>());
	}

	@Override
	public void editar(Sprint sprint) {
		usuariosAval = usuarioBO.pesquisar(new Usuario());
		objeto = sprint;
		usuariosAval.removeAll(objeto.getUsuarios());
		usuarios = new DualListModel<Usuario>(usuariosAval, objeto.getUsuarios());
	}

	public void excluir() {
		sprintBO.delete(objeto);
		lista.remove(objeto);
		addMessage(FacesMessage.SEVERITY_INFO, "Sprint Excluido com Sucesso", " "); 
	}

	@Override
	public void salvar() {
		context = RequestContext.getCurrentInstance();
		
		objeto.setUsuarios(usuarios.getTarget());
		
		if(validateForm()){
			if(objeto.getCodigo() == null){
				lista.add(sprintBO.insert(objeto));
				addMessage(FacesMessage.SEVERITY_INFO, "Sprint Cadastrado com Sucesso", " "); 
			}else{
				sprintBO.update(objeto);	
				quadroService.update(objeto);
				addMessage(FacesMessage.SEVERITY_INFO, "Sprint Alterado com Sucesso", " "); 
			}
			context.addCallbackParam("sucesso", true);  
		}else{
			context.addCallbackParam("sucesso", false);  			
		}
		
	}
	
	@Override
	public boolean validateForm() {
		StringBuilder sb = new StringBuilder(100);

		if(isEmpty(objeto.getTitulo())) sb.append("Campo Título vazio <br />");
		if(objeto.getProjeto() == null ) sb.append("Campo Projeto vazio <br />");
		if(isEmpty(objeto.getDescricao())) sb.append("Campo Descrição vazio <br />");
		
		if(!sb.toString().isEmpty()){
			addMessage(FacesMessage.SEVERITY_ERROR, "Campos Inválidos", sb.toString());
			return false;
		}else{
			return true;
		}
	}

	public List<StatusSprint> getStatusSprints(){
		return Arrays.asList(StatusSprint.values());
	}
	
	public List<Projeto> getProjetos(){
		return projetos;
	}

	public DualListModel<Usuario> getUsuarios() {
		return usuarios;
	}

	public void setUsuarios(DualListModel<Usuario> usuarios) {
		this.usuarios = usuarios;
	}
}
